using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GhostAI : MonoBehaviour
{
  public float moveSpeed = 4f;
    private Vector3[] directions = { Vector3.forward, Vector3.back, Vector3.left, Vector3.right }; // 四个方向
    private Vector3 currentDirection;
    private Rigidbody rb;
    private bool isFleeing; // 是否处于逃跑状态（能量豆模式）
    private Renderer ghostRenderer; // 幽灵渲染器（用于变色）
    private Color originalColor; // 原始颜色

    void Start() {
        rb = GetComponent<Rigidbody>();
        ghostRenderer = GetComponent<Renderer>();
        originalColor = ghostRenderer.material.color;
        // 随机初始方向
        currentDirection = directions[Random.Range(0, directions.Length)];
        // 定时随机转向（2-4秒一次）
        InvokeRepeating(nameof(ChangeDirection), 2f, Random.Range(2f, 4f));
    }

    void FixedUpdate() {
        // 移动（如果前方有墙，强制转向）
        if (!CanMove(currentDirection)) {
            ChangeDirection();
        }
        rb.velocity = currentDirection * moveSpeed;
    }

    // 随机改变方向（优先选择能移动的方向）
    private void ChangeDirection() {
        Vector3 newDirection = currentDirection;
        // 尝试随机方向，直到找到可移动的方向
        while (!CanMove(newDirection)) {
            newDirection = directions[Random.Range(0, directions.Length)];
        }
        currentDirection = newDirection;
        // 逃跑模式下，方向反转（远离玩家）
        if (isFleeing) {
            currentDirection = -currentDirection;
        }
        // 旋转幽灵朝向移动方向
        transform.rotation = Quaternion.LookRotation(currentDirection);
    }

    // 检测方向是否可移动（同玩家逻辑）
    private bool CanMove(Vector3 dir) {
        RaycastHit hit;
        if (Physics.Raycast(transform.position, dir, out hit, 0.6f)) {
            return !hit.collider.CompareTag("Wall");
        }
        return true;
    }

    // 切换逃跑模式（能量豆生效时）
    public void SetFleeMode(bool flee) {
        isFleeing = flee;
        // 逃跑时变蓝色，否则恢复原色
        ghostRenderer.material.color = flee ? Color.blue : originalColor;
    }

    // 幽灵被吃掉时调用
    public void Eaten() {
        // 简单处理：隐藏幽灵，3秒后在出生点复活
        gameObject.SetActive(false);
        Invoke(nameof(Respawn), 3f);
    }

    // 复活（回到初始位置）
    private void Respawn() {
        transform.position = new Vector3(0, 0.5f, 0); // 假设出生点在(0,0.5,0)
        gameObject.SetActive(true);
        SetFleeMode(false); // 复活后恢复正常模式
    }

    // 碰撞玩家时通知游戏管理器
    void OnCollisionEnter(Collision other) {
        if (other.collider.CompareTag("Player")) {
            GameManager.Instance.OnPlayerHitGhost(this);
        }
    }
}
